package io.github.echarts.model.geometry;

/**
 * 表示二维平面上的一个点
 * 使用逻辑坐标系（左下角为原点，Y轴向上为正方向）
 */
public class Point {
    
    /**
     * X坐标
     */
    private final double x;
    
    /**
     * Y坐标
     */
    private final double y;
    
    /**
     * 创建一个点
     * 
     * @param x X坐标
     * @param y Y坐标
     */
    public Point(double x, double y) {
        this.x = x;
        this.y = y;
    }
    
    /**
     * 创建原点(0,0)
     * 
     * @return 原点
     */
    public static Point origin() {
        return new Point(0, 0);
    }
    
    /**
     * 获取X坐标
     * 
     * @return X坐标值
     */
    public double getX() {
        return x;
    }
    
    /**
     * 获取Y坐标
     * 
     * @return Y坐标值
     */
    public double getY() {
        return y;
    }
    
    /**
     * 计算与另一个点的距离
     * 
     * @param other 另一个点
     * @return 两点之间的欧几里得距离
     */
    public double distanceTo(Point other) {
        double dx = x - other.x;
        double dy = y - other.y;
        return Math.sqrt(dx * dx + dy * dy);
    }
    
    /**
     * 创建一个新点，表示当前点按指定偏移量移动后的结果
     * 
     * @param deltaX X轴偏移量
     * @param deltaY Y轴偏移量
     * @return 偏移后的新点
     */
    public Point offset(double deltaX, double deltaY) {
        return new Point(x + deltaX, y + deltaY);
    }
    
    /**
     * 创建一个新点，表示当前点与另一个点的中点
     * 
     * @param other 另一个点
     * @return 两点的中点
     */
    public Point midPoint(Point other) {
        return new Point((x + other.x) / 2, (y + other.y) / 2);
    }
    
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        
        Point point = (Point) o;
        
        if (Double.compare(point.x, x) != 0) return false;
        return Double.compare(point.y, y) == 0;
    }
    
    @Override
    public int hashCode() {
        int result;
        long temp;
        temp = Double.doubleToLongBits(x);
        result = (int) (temp ^ (temp >>> 32));
        temp = Double.doubleToLongBits(y);
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        return result;
    }
    
    @Override
    public String toString() {
        return "Point{" +
                "x=" + x +
                ", y=" + y +
                '}';
    }
} 